package org.footballmanager.pandafootball.system.service;

import org.footballmanager.pandafootball.system.domain.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

public interface FootUserPersonService extends BaseService<FootUserPerson> {
    /**
     * 下放指定用户的指定球员
     *
     * @param userId  用户主键
     * @param qyId    球员主键
     * @param xycs    续约次数
     * @param request 请求
     */
    void deletePersonFromMyTeam(Long userId, Long qyId, Integer xycs, HttpServletRequest request);

    /**
     * 下放指定用户的所有球员
     *
     * @param userId  用户主键
     * @param request 请求
     */
    void deleteAllPerson(Long userId, HttpServletRequest request);

    /**
     * 随机分配11个75分以下的球员
     *
     * @param userId  用户主键
     * @param request 请求
     */
    void randomLow75(Long userId, HttpServletRequest request);

    /**
     * 续约球员
     *
     * @param userId  用户主键
     * @param qyId    球员主键
     * @param num     数量
     * @param request 请求
     * @return josn返回值
     */
    JsonReturn renew(Long userId, Long qyId, Integer num, HttpServletRequest request);

    /**
     * 根据用户主键查找该用户的所有信息
     *
     * @param userId 用户主键
     * @return 该用户的所有球员信息列表
     */
    List<FootUserPerson> findPersonByUserId(Long userId);

    /**
     * 根据用户主键查找该用户的所有球员
     *
     * @param userId  用户主键
     * @param request 请求
     * @return 该用户的所有球员列表
     */
    List<FootPerson> findFootPersonByUserId(Long userId, HttpServletRequest request);

    /**
     * 自动减球员场次，如果为0自动解约
     *
     * @param userId  用户主键
     * @param request 请求
     */
    void autoDeletePerson(Long userId, HttpServletRequest request);

    /**
     * 增加次数，为删除报分使用
     *
     * @param userId  用户主键
     * @param request 请求
     */
    void addUseTimes(Long userId, HttpServletRequest request);

    /**
     * 保存球员到数据库中
     *
     * @param userId     用户主键
     * @param footPerson 球员实体类
     * @param request    请求
     */
    void saveUserPerson(Long userId, FootPerson footPerson, HttpServletRequest request);

    /**
     * 获取可以挂牌的所有球员
     *
     * @param userId 用户主键
     * @return 可以挂牌的所有球员列表
     */
    List<FootPerson> findCanGpPerson(Long userId);

    /**
     * 根据用户主键和球员主键找球员关系信息列表
     *
     * @param userId 用户主键
     * @param qyId   球员主键
     * @return 球员关系信息列表
     */
    List<FootUserPerson> findFootPersonsByUserIdandQyId(Long userId, Long qyId);

    /**
     * 查看主力人员人数
     *
     * @param user 用户实体类
     * @return 人数
     */
    int checkMainPerson(FootUser user);

    /**
     * 根据用户主键获取该用户的主力战斗值
     *
     * @param userId  用户主键
     * @param request 请求
     * @return 主力战斗值
     */
    double getPower(Long userId, HttpServletRequest request);

    /**
     * 合成球员，增加战力
     *
     * @param fup1    球员1关系主键
     * @param fup2    球员2关系主键
     * @param request 请求
     * @return json返回值
     */
    JsonReturn compose(Long fup1, Long fup2, HttpServletRequest request);

    /**
     * 根据球员主键和续约次数查找对应球员
     *
     * @param userId 用户主键
     * @param qyId   球员主键
     * @param xycs   续约次数
     * @return 对应球员
     */
    FootUserPerson findPersonByQyidandXycs(Long userId, Long qyId, Integer xycs);

    /**
     * 天梯赛 获取符合条件的战队并随机取一个
     *
     * @param user 用户实体类
     * @return 符合条件的战队并随机取一个
     */
    FootTeam getRandomTeam(FootUser user);

    /**
     * 根据球员信息查找是否有对应已经设为主力的队员
     *
     * @param userId 用户主键
     * @param fup    球员用户关系实体类
     * @return 是否设为主力的队员
     */
    boolean findPersonMain(Long userId, FootUserPerson fup);

    /**
     * 删除没有的球员
     *
     * @param qyId 球员主键
     */
    void deletePersonByQyid(Long qyId);

    /**
     * 根据报分记录获取球员信息
     *
     * @param bf      报分记录实体类
     * @param isQd1   是否获取主场
     * @param request 请求
     * @return 球员列表
     */
    List<FootPerson> findQd(FootBfinfo bf, boolean isQd1, HttpServletRequest request);
}
